package san.java.day13;

import java.io.*;

/**
 * 对象流: 对象持久化和对象的网络传输
 *  将Java对象写入到数据源中:
 *      1. 序列化: 用ObjectOutputStream类将一个Java对象写入IO流中
 *      2. 反序列化: 用ObjectInputStream从IO流中恢复对象
 *
 *  要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某类是可序列化的,该类必须实现如下两个接口之一:
 *      1. Serializable  一般用上面这个
 *      2. Externalizable
 *
 *  注意:
 *      1. 序列化和反序列化针对的是对象的各种属性,不包括类的属性
 *      2. 对象的序列化和反序列化使用的类要严格一致:
 *          i 包名, 类名,类结构等等所有都要一致
 */

public class ObjectStream_06 {

    public static void main(String[] args) {
//        try {
//            testSerialize();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        try {
            testDeSerialize();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 对象的序列化
     */
    public static void testSerialize() throws IOException {
        // 定义对象的输出流,把对象序列化之后的流放到指定的磁盘文件中
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data/person.txt"));

        Person person = new Person();
        person.name = "san";
        person.age = 26;

        out.writeObject(person);
        out.flush();
        out.close();
    }

    /**
     * 对象的反序列化
     */
    public static void testDeSerialize() throws IOException, ClassNotFoundException {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("data/person.txt"));

        Person p = (Person)in.readObject();
        p.showInfo();
        in.close();
    }
}
